<?php

/**
 * Это модель для таблицы "project".
 *
 * Следующие поля доступны в таблице 'project':
 * @property integer $id
 * @property string $name
 * @property string $description
 * @property string $sow
 * @property integer $id_user_customer
 * @property integer $id_user_manager
 * @property integer $budget
 * @property string $date_started
 * @property string $date_finished
 * @property string $date_created
 * @property string $date_updated
 */
class Project extends CActiveRecord
{
	public $deleteFile;
	public $file;
	
	/**
	 * @return string имя таблицы в БД
	 */
	public function tableName()
	{
		return 'project';
	}

	/**
	 * @return array правила проверки полей (применяются при сохранении модели)
	 */
	public function rules()
	{
		return array(
			array('name, description, id_user_customer, id_user_manager', 'required'),
			array('id_user_customer, id_user_manager, budget', 'numerical', 'integerOnly'=>true),
			array('name, sow', 'length', 'max'=>255),
			array('date_started, date_finished, date_updated, date_created', 'date', 'format'=>'dd.MM.yyyy'),
			array('file', 'file', 'types'=>'pdf, doc, docx, txt, rtf', 'allowEmpty'=>true,'on'=>'insert,update'),
		);
	}

	/**
	 * @return array собственные подписи полей
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'name' => 'Название',
			'description' => 'Описание',
			'sow' => 'ТЗ',
			'id_user_customer' => 'Заказчик',
			'id_user_manager' => 'Менеджер',
			'budget' => 'Бюджет (ч)',
			'date_started' => 'Дата начала',
			'date_finished' => 'Дата окончания',
			'date_created' => 'Дата создания',
			'date_updated' => 'Дата последнего обновления',
		);
	}
	
	
	/**
	 * Возвращает статическую модель определенного класса ActiveRecord
	 * @param string $className название класса модели ActiveRecord
	 * @return статичную модель класса Project
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}
	
	/**
	 * Возвращает список поведения, прикрепленных к данному классу
	 * Поведение - это некоторый часть повторяющегося кода
	 * Его можно определить один раз и применять во множестве классов
	 */
	public function behaviors(){
        return array(
			'HasAttachmentBehavior' => array(
				'class' => 'application.components.HasAttachmentBehavior',
				'path' => '/files/docs',
				'filePath' => 'sow'
			),
            'AutoTimestampBehavior' => array(
                'class' => 'application.components.AutoTimestampBehavior',
                'created' => 'date_created',
                'modified' => 'date_updated',
            ),
            'DateFormatBehavior' => array(
                'class' => 'application.components.DateFormatBehavior',
                'dates' => array('date_created', 'date_updated', 'date_started', 'date_finished'),
            )
        );
    }

	/**
	 * @return array список связей
	 */
	public function relations()
	{
		return array(
			'manager' => array(self::BELONGS_TO, 'User', 'id_user_manager'),
			'customer' => array(self::BELONGS_TO, 'User', 'id_user_customer'),
			'issues' => array(self::HAS_MANY, 'Issue', 'id_project'),
			'chunks' => array(self::HAS_MANY, 'Chunk', 'id_project')
		);
	}
	
	/**
	 * @return array список фильтров
	 */
	public function scopes()
	{
		return array(
			'withUsers' => array(
				'with' => array('manager', 'customer')
			)
		);
	}
	
	public function beforeFind()
	{
		$user = Yii::app()->user;
		$criteria = array();
//		if(!$user->checkAccess('admin') && !$user->checkAccess('developer'))
//		{
//			if($user->checkAccess('manager'))
//			{
//				$criteria = array(
//					'condition' => 'id_user_manager = :id_user',
//					'params' => array(
//						':id_user' => $user->getId()
//					)
//				);
//			}
//			else if($user->checkAccess('customer'))
//			{
//				$criteria = array(
//					'condition' => 'id_user_customer = :id_user',
//					'params' => array(
//						':id_user' => $user->getId()
//					)
//				);
//			}
//		}
		
		$this->getDbCriteria()->mergeWith($criteria);
		return parent::beforeFind();
	}
	
	public function count($criteria)
	{
		$this->beforeFind();
		return parent::count($criteria);
	}
	
	public function beforeDelete()
	{
		foreach($this->issues as $item)
			$item->delete();
		foreach($this->chunks as $item)
			$item->delete();
		return parent::beforeDelete();
	}
}
